import java.io.File;
import java.io.FileReader;
import java.io.IOException;
import java.io.Reader;
import java.util.Scanner;

public class IO_Demo {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        System.out.println("请输入要扫描的根目录");
        File rootDir = new File(scanner.next());
        if (!rootDir.isDirectory()){
            System.out.println("输入有误，您输入的目录不存在");
            return;
        }
        //让用户输入另一个要查询的词
        System.out.println("请输入要查询的词:");
        String word = scanner.next();
        //3、递归地进行目录/文件的遍历
        scanDir(rootDir,word);
    }

    private static void scanDir(File rooDir,String word){
        //列出当前的rootDir中的内容，没有内容，直接递归结束
        File[] files = rooDir.listFiles();
        if (files == null){
            //当前rootDir是一个空的目录，没有必要继续递归
            return;
        }
        //目录中如果有内容，就遍历目录中的每一个元素
        for (File f : files){
            System.out.println("当前搜索到:"+f.getAbsolutePath());
            if (f.isFile()){
                //如果f是一个文件，则打开文件读取内容，比较是否包含上述关键词
                String content = readFile(f);
                if (content.contains(word)){
                    System.out.println(f.getAbsolutePath()+"包含要查找的关键字！");
                }
            }else if (f.isDirectory()){
                //如果f是个目录，则对这个目录进行递归操作
                scanDir(f,word);
            }else {
                //既不是普通文件，也不是目录文件，直接跳过
                continue;
            }
        }
    }
    private static String readFile(File f){
        //读取文件的整个内容并返回
        //使用字符流来读取，由于咱们匹配的是字符串，此处只能按照字符流处理才有意义
        StringBuilder stringBuilder = new StringBuilder();
        try(Reader reader = new FileReader(f)){
            //一次读一个字符，把读到的结果拼装到StringBuilder中，统一转换为String
            while (true){
                int c = reader.read();
                if (c == -1){
                    break;
                }
                stringBuilder.append((char)c);
            }
        }catch (IOException e){
            e.printStackTrace();
        }
        return stringBuilder.toString();
    }
}
